﻿#region << 文 件 说 明 >>

/*----------------------------------------------------------------
// 文件名称：EnumHelper
// 创 建 者：杨程
// 创建时间：2021/6/9 14:40:40
// 文件版本：V1.0.0
// ===============================================================
// 功能描述：
//
//
//----------------------------------------------------------------*/

#endregion

namespace Vampirewal.Core;

/// <summary>
/// 枚举扩展类
/// </summary>
public static class EnumHelper
{
    /// <summary>
    /// 获取枚举的Display文本
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public static string GetDisplay(this Enum value)
    {
        var type = value.GetType();//先获取这个枚举的类型
        var field = type.GetField(value.ToString());//通过这个类型获取到值
        var obj = (DisplayAttribute)field.GetCustomAttribute(typeof(DisplayAttribute));//得到特性
        return obj.Name ?? "";
    }

    /// <summary>
    /// 获取枚举的Description文本
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    public static string GetDescription(this Enum value) 
    {
        var type = value.GetType();//先获取这个枚举的类型
        var field = type.GetField(value.ToString());//通过这个类型获取到值
        var obj = (DescriptionAttribute)field.GetCustomAttribute(typeof(DescriptionAttribute));//得到特性
        return obj.Description ?? "";
    }

    /// <summary>
    /// 获取枚举列表
    /// </summary>
    /// <typeparam name="T">枚举</typeparam>
    /// <returns></returns>
    public static List<EnumberCreditType> EnumToList<T>()
    {
        List<EnumberCreditType> list = new List<EnumberCreditType>();

        foreach (var e in Enum.GetValues(typeof(T)))
        {
            EnumberCreditType m = new EnumberCreditType();
            DescriptionAttribute DescriptionAtt = e.GetType().GetField(e.ToString()).GetCustomAttribute<DescriptionAttribute>(true);
            if (DescriptionAtt != null)
            {
                DescriptionAttribute da = DescriptionAtt;
                m.Desction = da.Description;
            }
            //SetClassification
            SetClassificationAttribute setClassificationAtt = e.GetType().GetField(e.ToString()).GetCustomAttribute<SetClassificationAttribute>(true);
            if (setClassificationAtt != null)
            {
                SetClassificationAttribute da = setClassificationAtt;
                m.Classification = da.Type;
            }
            //Display
            DisplayAttribute disAtt = e.GetType().GetField(e.ToString()).GetCustomAttribute<DisplayAttribute>(true);
            if (disAtt != null)
            {
                DisplayAttribute da = disAtt;
                m.Name = da.Name;
            }

            m.Value = Convert.ToInt32(e);
            m.Key = e.ToString();
            list.Add(m);
        }
        return list;
    }
}